package com.ruoyi.excelutils.controller;

import com.ruoyi.common.core.domain.R;
import com.ruoyi.excelutils.entity.vo.HqNetworkBillDetailExportPageSizeVo;
import com.ruoyi.excelutils.service.TtlProductInfoService;
import com.ruoyi.hqfinance.domain.vo.HqNetworkBillPointVo;
import com.ruoyi.statisticalCenter.domain.vo.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.Random;
import java.util.concurrent.TimeUnit;

/**
 * @author kundy
 * @create 2019/2/13 9:06 PM
 */

@RestController
@RequestMapping("/exportUtils")
@Api(tags = "导出")
public class ExportController {
    @Autowired
    private HttpServletResponse response;

    @Autowired
    private TtlProductInfoService productInfoService;

    private final StringRedisTemplate stringRedisTemplate;

    public ExportController(StringRedisTemplate stringRedisTemplate) {
        this.stringRedisTemplate = stringRedisTemplate;
    }

    @GetMapping("/export")
    public void export(HttpServletResponse response) {
        this.productInfoService.export(response, "网点账单明细" + new Random().nextInt(1000));
    }

    @ApiOperation("导出")
    @PostMapping("/exportList")
    public void exportList(@RequestBody HqNetworkBillDetailExportPageSizeVo vo) {
        if (vo != null && vo.getStartTime()!= null && vo.getEndTime() != null) {
            String startTime = vo.getStartTime().replace("-", "");
            String endTime = vo.getEndTime().replace("-", "");
            vo.setStartTime(startTime);
            vo.setEndTime(endTime);
        }
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        this.productInfoService.list(response, "网点账单明细" + new Random().nextInt(1000), vo);
    }

    @ApiOperation("统计中心-出港发件成本报表")
    @PostMapping("/scOutExport")
    public R scOutExport(@RequestBody HqNetworkBillPointVo vo) {
        if (vo != null && vo.getStartTime()!= null && vo.getEndTime() != null) {
            String startTime = vo.getStartTime().replace("-", "");
            String endTime = vo.getEndTime().replace("-", "");
            vo.setStartTime(startTime);
            vo.setEndTime(endTime);
        }
        //response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        //this.productInfoService.scOutExport(response, "网点账单明细" + new Random().nextInt(1000), vo);

        // 创建一个用于存储请求参数哈希键
        String requestKey = "EXPORT_DETAIL_REQUEST:" + vo.toString();
        // 创建一个用于存储请求时间戳的key
        String timestampKey = "EXPORT_DETAIL_TIMESTAMP:" + requestKey;

        // 检查是否有最近2分钟内的相同请求记录
        boolean existsInCache = stringRedisTemplate.opsForValue().setIfAbsent(timestampKey, LocalDateTime.now().toString(), 2, TimeUnit.MINUTES);
        if (!existsInCache) {
            // 已经存在2分钟内的相同请求记录，返回提示信息
            return R.fail("请勿重复下载，您在两分钟内已经发起过相同的导出请求！");
        }

        // 保存请求参数到Redis（可选，用于后续服务处理）
        stringRedisTemplate.opsForValue().set(requestKey, vo.toString(), 2, TimeUnit.MINUTES);

        // 调用服务进行异步导出
        this.productInfoService.scOutExportAsync(vo);

        return R.ok("请前往总部下载中心查询进度");
    }

    @ApiOperation("统计中心-进港派件毛利报表 ")
    @PostMapping("/scPaiGrossProfitSheet")
    public R scPaiGrossProfitSheet(@RequestBody ScEnterPaiGrossProfitSheetPointVo vo) {
        if (vo != null && vo.getStartTime()!= null && vo.getEndTime() != null) {
            String startTime = vo.getStartTime().replace("-", "");
            String endTime = vo.getEndTime().replace("-", "");
            vo.setStartTime(startTime);
            vo.setEndTime(endTime);
        }
//        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
//        this.productInfoService.scPaiGrossProfitSheetExport(response, "进港派件毛利报表明细" + new Random().nextInt(1000), vo);
        // 创建一个用于存储请求参数哈希键
        String requestKey = "EXPORT_DETAIL_REQUEST:" + vo.toString();
        // 创建一个用于存储请求时间戳的key
        String timestampKey = "EXPORT_DETAIL_TIMESTAMP:" + requestKey;

        // 检查是否有最近2分钟内的相同请求记录
        boolean existsInCache = stringRedisTemplate.opsForValue().setIfAbsent(timestampKey, LocalDateTime.now().toString(), 2, TimeUnit.MINUTES);
        if (!existsInCache) {
            // 已经存在2分钟内的相同请求记录，返回提示信息
            return R.fail("请勿重复下载，您在两分钟内已经发起过相同的导出请求！");
        }

        // 保存请求参数到Redis（可选，用于后续服务处理）
        stringRedisTemplate.opsForValue().set(requestKey, vo.toString(), 2, TimeUnit.MINUTES);

        // 调用服务进行异步导出
        this.productInfoService.scPaiGrossProfitSheetExportAsync(vo);

        return R.ok("请前往总部下载中心查询进度");
    }

    @ApiOperation("统计中心-质控费用汇总报表")
    @PostMapping("/scQualityPoint")
    public R scQualityPoint(@RequestBody ScQualityControlFeeSheetPointVo vo) {
        if (vo != null && vo.getStartTime()!= null && vo.getEndTime() != null) {
            String startTime = vo.getStartTime().replace("-", "");
            String endTime = vo.getEndTime().replace("-", "");
            vo.setStartTime(startTime);
            vo.setEndTime(endTime);
        }
//        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
//        this.productInfoService.scQualityExport(response, "质控费用汇总报表明细" + new Random().nextInt(1000), vo);
        // 创建一个用于存储请求参数哈希键
        String requestKey = "EXPORT_DETAIL_REQUEST:" + vo.toString();
        // 创建一个用于存储请求时间戳的key
        String timestampKey = "EXPORT_DETAIL_TIMESTAMP:" + requestKey;

        // 检查是否有最近2分钟内的相同请求记录
        boolean existsInCache = stringRedisTemplate.opsForValue().setIfAbsent(timestampKey, LocalDateTime.now().toString(), 2, TimeUnit.MINUTES);
        if (!existsInCache) {
            // 已经存在2分钟内的相同请求记录，返回提示信息
            return R.fail("请勿重复下载，您在两分钟内已经发起过相同的导出请求！");
        }

        // 保存请求参数到Redis（可选，用于后续服务处理）
        stringRedisTemplate.opsForValue().set(requestKey, vo.toString(), 2, TimeUnit.MINUTES);

        // 调用服务进行异步导出
        this.productInfoService.scQualityExportAsync(vo);

        return R.ok("请前往总部下载中心查询进度");
    }

    @ApiOperation("统计中心-总部收支汇总报表")
    @PostMapping("/scIncomeExpendPoint")
    public R scIncomeExpendPoint(@RequestBody ScHqIncomeAndExpendCollectPointVo vo) {
        if (vo != null && vo.getStartTime()!= null && vo.getEndTime() != null) {
            String startTime = vo.getStartTime().replace("-", "");
            String endTime = vo.getEndTime().replace("-", "");
            vo.setStartTime(startTime);
            vo.setEndTime(endTime);
        }
        /*response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        this.productInfoService.scIncomeAndExpendExport(response, "质控费用汇总报表明细" + new Random().nextInt(1000), vo);*/

        // 创建一个用于存储请求参数哈希键
        String requestKey = "EXPORT_DETAIL_REQUEST:" + vo.toString();
        // 创建一个用于存储请求时间戳的key
        String timestampKey = "EXPORT_DETAIL_TIMESTAMP:" + requestKey;

        // 检查是否有最近2分钟内的相同请求记录
        boolean existsInCache = stringRedisTemplate.opsForValue().setIfAbsent(timestampKey, LocalDateTime.now().toString(), 2, TimeUnit.MINUTES);
        if (!existsInCache) {
            // 已经存在2分钟内的相同请求记录，返回提示信息
            return R.fail("请勿重复下载，您在两分钟内已经发起过相同的导出请求！");
        }

        // 保存请求参数到Redis（可选，用于后续服务处理）
        stringRedisTemplate.opsForValue().set(requestKey, vo.toString(), 2, TimeUnit.MINUTES);

        // 调用服务进行异步导出
        this.productInfoService.exportDetailAsync(vo);

        return R.ok("请前往总部下载中心查询进度");
    }

    @ApiOperation("统计中心-出港包仓毛利报表")
    @PostMapping("/scOutPortWarehousePoint")
    public R scOutPortWarehousePoint( @RequestBody ScOutPortWarehouseGrossProfitSheetPointVo vo) {
        if (vo != null && vo.getStartTime()!= null && vo.getEndTime() != null) {
            String startTime = vo.getStartTime().replace("-", "");
            String endTime = vo.getEndTime().replace("-", "");
            vo.setStartTime(startTime);
            vo.setEndTime(endTime);
        }
        /*response.setContentType("content-length");
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        this.productInfoService.scOutPortWarehouseExport(response, "出港包仓毛利报表明细" + new Random().nextInt(1000), vo);*/
        
        // 创建一个用于存储请求参数哈希键
        String requestKey = "EXPORT_DETAIL_REQUEST:" + vo.toString();
        // 创建一个用于存储请求时间戳的key
        String timestampKey = "EXPORT_DETAIL_TIMESTAMP:" + requestKey;

        // 检查是否有最近2分钟内的相同请求记录
        boolean existsInCache = stringRedisTemplate.opsForValue().setIfAbsent(timestampKey, LocalDateTime.now().toString(), 2, TimeUnit.MINUTES);
        if (!existsInCache) {
            // 已经存在2分钟内的相同请求记录，返回提示信息
            return R.fail("请勿重复下载，您在两分钟内已经发起过相同的导出请求！");
        }

        // 保存请求参数到Redis（可选，用于后续服务处理）
        stringRedisTemplate.opsForValue().set(requestKey, vo.toString(), 2, TimeUnit.MINUTES);

        // 调用服务进行异步导出
        this.productInfoService.scOutPortWarehouseExportAsync(vo);

        return R.ok("请前往总部下载中心查询进度");
    }

    @ApiOperation("统计中心-流向均重监控表")
    @PostMapping("/scWeightFlowPoint")
    public R scWeightFlowPoint( @RequestBody ScWeightFlowDirectionDispositionPointVo vo) {
        if (vo != null && vo.getStartTime()!= null && vo.getEndTime() != null) {
            String startTime = vo.getStartTime().replace("-", "");
            String endTime = vo.getEndTime().replace("-", "");
            vo.setStartTime(startTime);
            vo.setEndTime(endTime);
        }
        /*response.setContentType("content-length");
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        this.productInfoService.scWeightFlowExport(response, "流向均重监控报表明细" + new Random().nextInt(1000), vo);*/
        // 创建一个用于存储请求参数哈希键
        String requestKey = "EXPORT_DETAIL_REQUEST:" + vo.toString();
        // 创建一个用于存储请求时间戳的key
        String timestampKey = "EXPORT_DETAIL_TIMESTAMP:" + requestKey;

        // 检查是否有最近2分钟内的相同请求记录
        boolean existsInCache = stringRedisTemplate.opsForValue().setIfAbsent(timestampKey, LocalDateTime.now().toString(), 2, TimeUnit.MINUTES);
        if (!existsInCache) {
            // 已经存在2分钟内的相同请求记录，返回提示信息
            return R.fail("请勿重复下载，您在两分钟内已经发起过相同的导出请求！");
        }

        // 保存请求参数到Redis（可选，用于后续服务处理）
        stringRedisTemplate.opsForValue().set(requestKey, vo.toString(), 2, TimeUnit.MINUTES);

        // 调用服务进行异步导出
        this.productInfoService.scWeightFlowExportAsync(vo);

        return R.ok("请前往总部下载中心查询进度");
    }

    @ApiOperation("统计中心-出港返利毛利报表")
    @PostMapping("/scOutReturnPoint")
    public R scOutReturnPoint( @RequestBody ScOutReturnSheetPointVo vo) {
        if (vo != null && vo.getStartTime()!= null && vo.getEndTime() != null) {
            String startTime = vo.getStartTime().replace("-", "");
            String endTime = vo.getEndTime().replace("-", "");
            vo.setStartTime(startTime);
            vo.setEndTime(endTime);
        }
        /*response.setContentType("content-length");
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        this.productInfoService.scOutReturnExport(response, "出港返利毛利报表明细" + new Random().nextInt(1000), vo);*/
        // 创建一个用于存储请求参数哈希键
        String requestKey = "EXPORT_DETAIL_REQUEST:" + vo.toString();
        // 创建一个用于存储请求时间戳的key
        String timestampKey = "EXPORT_DETAIL_TIMESTAMP:" + requestKey;

        // 检查是否有最近2分钟内的相同请求记录
        boolean existsInCache = stringRedisTemplate.opsForValue().setIfAbsent(timestampKey, LocalDateTime.now().toString(), 2, TimeUnit.MINUTES);
        if (!existsInCache) {
            // 已经存在2分钟内的相同请求记录，返回提示信息
            return R.fail("请勿重复下载，您在两分钟内已经发起过相同的导出请求！");
        }

        // 保存请求参数到Redis（可选，用于后续服务处理）
        stringRedisTemplate.opsForValue().set(requestKey, vo.toString(), 2, TimeUnit.MINUTES);

        // 调用服务进行异步导出
        this.productInfoService.scOutReturnExportAsync(vo);

        return R.ok("请前往总部下载中心查询进度");
    }
}
